package rhplus.utilizador;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;

import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;

@PersistenceCapable
public class Utente implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Long id_pessoa;
    @Persistent
    private String tipo;

    public Long getIdPessoa() {
        return id_pessoa;
    }

    public Utente(Long id, String tipo) {
        this.id_pessoa = id;
        this.tipo = tipo;
    }

    public String getTipo() {
        return tipo;
    }

    public static void insere(Utente u) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(u);
        } finally {
            pm.close();
        }
    }

    public boolean temMembrosDoAgregado() {
        return !Cliente.getListaDeMembrosDoAgregado(id_pessoa).isEmpty();
    }

    public Long getNumeroDeCliente() {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Utente.class.getName()
                + " where id_pessoa == " + this.id_pessoa;

        List<Utente> c = (List<Utente>) pm.newQuery(query).execute();

        return c.get(0).getIdPessoa();
    }

    public static Long devolveIdUtentePorIdPessoa(Long idpessoa) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Utente.class.getName()
                + " where id_pessoa == " + idpessoa;

        List<Utente> u = (List<Utente>) pm.newQuery(query).execute();

        return u.get(0).getIdPessoa();
    }

    public static String devolveTipoPorIdPessoa(Long idpessoa) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Utente.class.getName()
                + " where id_pessoa == " + idpessoa;

        List<Utente> u = (List<Utente>) pm.newQuery(query).execute();

        return u.get(0).getTipo();
    }

    public static Utente devolvePorIdPessoa(Long id_pessoa) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Utente.class.getName()
                + " where id_pessoa == " + id_pessoa;

        List<Utente> u = (List<Utente>) pm.newQuery(query).execute();

        return u.get(0);
    }

    public TratamentoPassado getTratamentoPassado(final Long id_pessoa) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + TratamentoPassado.class.getName()
                + " where id_pessoa == " + id_pessoa;

        return ((List<TratamentoPassado>) pm.newQuery(query).execute()).get(0);


    }

//
//    public LinkedList<DoencaPassada> getListaDeDoencasPassadas() {
//        return lista_de_doencas_passadas;
//    }
//
//    public DoencaPassada getDoencaPassada(final int id_doenca_passada) {
//        // Procura a doenca passada associada ao identificador.
//        Iterator<DoencaPassada> iterator = lista_de_doencas_passadas.iterator();
//        while (iterator.hasNext()) {
//            DoencaPassada doenca_passada = iterator.next();
//            if (doenca_passada.equals(id_doenca_passada)) {
//                return doenca_passada;
//            }
//        }
//
//        // Se a DoencaPassada nao foi encontrada devolve null.
//        return null;
//    }
//
    public void adicionaDoencaPassada(final DoencaPassada dados) throws ClassNotFoundException, InstantiationException,
            IllegalAccessException, SQLException {
        // Inserir na base de dados.
        DoencaPassada.insere(dados);

        //  PersistenceManager pm = PMF.get().getPersistenceManager();

        // Adiciona a instancia do objecto.
        // int ultimo_id_inserido = DoencaPassada.devolveUltimoIdentificadorDeInsercao();
        //DoencaPassada doenca_passada = DoencaPassada.devolve(id_pessoa);

        //this.lista_de_doencas_passadas.add(doenca_passada);
    }

    public void alteraDoencaPassada(final DoencaPassada dados) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
//        // Procura a instancia do objecto.
//        int id_doenca_passada = ((Integer) dados.get("var_id_doenca_passada"));
//        DoencaPassada doenca_passada = DoencaPassada.devolve(id_doenca_passada);
//
//        // Altera o objecto.
//        doenca_passada.setSintomas((String) dados.get("var_sintomas"));
//        doenca_passada.setTratamento((String) dados.get("var_tratamento"));
//
//        // Invoca o metodo gravaParaBaseDeDados para gravar o objecto.
//        doenca_passada.gravaParaBaseDeDados();


         DoencaPassada.altera(dados);
    }

//    public void removeDoencaPassada(final int id_doenca_passada) throws SQLException, ClassNotFoundException, InstantiationException,
//            IllegalAccessException {
//
//        // Remove da instancia do objecto
//        Iterator<DoencaPassada> iterator = lista_de_doencas_passadas.iterator();
//        boolean encontrou_doenca_passada = false;
//        while (iterator.hasNext() && !encontrou_doenca_passada) {
//            if (iterator.next().equals(id_doenca_passada)) {
//                iterator.remove();
//                encontrou_doenca_passada = true;
//            }
//        }
//
//        // Remove do local de persist�ncia
//        DoencaPassada.remove(id_doenca_passada);
//    }
//
//    public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
//        super.gravaParaBaseDeDados();
//    }
//

    @Override
    public String toString() {
        String utente_em_string = super.toString();

        utente_em_string += "\nN�o existem registos de doencas passadas.";

        return utente_em_string;
    }
}
